package Mask;

import java.io.File; // Импортируем класс для работы с файловой системой
import java.io.FileFilter; // Классы для регулярных выражений
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class MaskFilter implements FileFilter {

	/** Правила пользования классом
	
	- Для приведения маски к регулярному выражению вызывается метод maskToRegExp(File);
	
	- Для компиляции регулярного выражения вызывается метод RegExp(String);
	
	- Для наложения регулярного выражения на файл вызывается метод accept(File);
	*/

	private Pattern p;  // поле хранения регулярного выражения

	public MaskFilter () /*constructor overload*/ {
		p = null;
	}
	
	public MaskFilter (Pattern _p) /*constructor overload*/ {
		p = _p;
	}
	
	// Функция приведения маски к регулярному выражению
	public void maskToRegExp (String _mask) {
		/** Маска строится по следующим правилам:
			?  - один символ
			*  - много символов
			[] - группа символов
			-  - диапазон символов (только в группе [])
			,  - перечисление символов (только в группе [])
		*/
		
		StringBuffer mask = new StringBuffer(_mask);
		
		for (int i = 0, j = 0; i < _mask.length(); i++, j++) {
			if (_mask.charAt(i) == '.') {	// Если задана точка,
				mask.insert(j++,"\\");	// перед ней ставим "\"
			}
			if (_mask.charAt(i) == '*') {	// "*" - повторение предыдущего символа от нуля
				mask.insert(j++,'.');	// поэтому перед ней надо ставить "." - любой символ
			}
			if (_mask.charAt(i) == '?') {	// "?" - в терминале обозначает любой символ,
				mask.delete(j,j+1);	// в рег. выражениях ему соответствует "."
				mask.insert(j,".");
			}
		}
		
		regExp(mask.toString());
	}
	
	// Функция компиляции регулярного выражения
	public void regExp(String _reg) {
		/** Правила пострения регулярного выражения
		.	любой символ
		+	повторение символа 1 или более раз
		?	повторение символа 0 или более раз
		()	группа символов
		[]	набор символов (например, диапазон)
		,	перечисление символов (в наборе [])
		-	диапазон символов (в наборе [])
		{n}	повторение предыдущего символа n раз
		{n,m}	повторение предыдущего символа от n до m раз
		*/
	
		p = Pattern.compile(_reg
			/* ,Pattern.CASE_INSENSITIVE |  Pattern.UNICODE_CASE */);
	}
	
	// Функция проверки имени файла на соответствие регулярному выражению
	public boolean accept (File pathname) {
		// Если регулярное выражение не задано, значит объект подходит,
		// иначе выполняем проверку на соответствие
		return (p == null) ? true : (p.matcher(pathname.getName())).matches();
	}
	
} // class MaskFilter
